//引入官方提供的插件vuex
//引入Vuex是一个对象,因为Vuex是一个插件，插件一定对外暴露一个对象，对象需要拥有install方法！！！
//第一步
import Vuex from 'vuex';
//引入Vue，因为Vue.use方法才可以使用插件
//第二步
import Vue from 'vue';
//第三步
//使用插件
Vue.use(Vuex);
//第四步
//Store这个单词是大写的，因为Store是一个构造函数，是一个类！！！！
//当Store方法调用的时候，需要传递一个配置对象（配置对象的K:V能瞎写吗）
export default new Vuex.Store({
    //state->存储项目中数据，进行统一管理数据---[仓库：统一管理数据]
    state: {
        count: 1,
    },
    //唯一修改数据state地方
    mutations: {
        //1:mutation,名字记住了，都是大写的
        //2:mutations右侧对象的一个方法即为一个mutation
        //第一个参数:仓库的数据state
        ADDNUM(state) {
            //mutation唯一修改state的手段
            state.count++;
        },
        MINUSNUM(state) {
            state.count--;
        },
        //TENNUM类型的mutation
        //第一个参数：仓库中的数据state
        //第二个参数：commit提交mutation的时候，传递的第二个参数
        TENNUM(state, ten) {
            state.count += ten;
        }
    }
    ,
    //actions->可以书写业务逻辑，if、for、异步---(业务逻辑)
    //这里不能修改state
    actions: {
        //组件触发action,仓库当中需要有相应的类型的action！！！！
        //action到底是什么鬼那?
        //action:即为actions,右侧对象的方法(对象写法)
        //第一个参数:对象(state,commit)。---小仓库
        addNum({ commit }) {
            //action：不能直接修改数据的！！！！
            //唯一能修改数据的手段即为mutiaon
            //action在提交mutation，要修改仓库的数据,mutation名字（类型），必须首字母大写！！！！！
            commit("ADDNUM");
        },
        //minusNum类型action
        minusNum({ commit, state }) {
            //不能在这里修改数据
            commit("MINUSNUM");
        },
        //evenNum类型的action
        evenNum({ commit, state }) {
            //action：可以书写业务逻辑if、for、异步语句
            //判断:判断仓库的数据是不是偶数
            if (state.count % 2 == 0) {
                //如果是偶数才会调用mutation-->ADDNUM类型mutation函数！！！！
                //奇数不会调用ADDNUM类型的mutations进行修改数据
                commit('ADDNUM')
            }

        }
        ,
        //oddNum类型的action
        oddNum({ commit, state }) {
            //acitons这里可以书写业务逻辑，但是不能直接修改state
            //判断的条件：奇数让数值加上1
            if (state.count % 2 != 0) {
                //提交mutation，如果符合条件，让数据+1
                commit("ADDNUM");
            }
        }
        ,
        //tenNum类型的action
        //任何action函数：第一个参数对象（小仓库:state,commit,dispatch）
        //第二个参数是：dispatch的时候传递参数
        tenNum({ commit, state, dispatch }, ten) {
            //action:不允许直接修改state的数据
            //在action函数提交mutation的时候---调用mutation函数吗？
            //可以传递参数
            commit("TENNUM", ten);
        }
        ,
        //delayNum类型的action
        delayNum({commit,state,dispatch}){
             //2s之后+1 
             //异步语句
             setTimeout(()=>{
                commit('ADDNUM'); 
             },5000);

        }
    }

});



